struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode() : val(0), left(nullptr), right(nullptr) {}
      TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
      TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
  right(right) {}
 };




class Solution {
public:
    void _flatten(TreeNode* root) {
        if (root == nullptr)
            return;

        _flatten(root->right);
        _flatten(root->left);

    // 左子树右指针衔接的核心注意事项
    // 左子树与原右子树衔接时 需重点关注衔接位置的准确性 这是避免节点丢失、确保链表完整的关键核心要点
    // 是必须将原右子树衔接在左子树展开后链表的末尾节点的右指针上 而非左子树的根节点的右指针上
    // 以常见测试场景（输入树 [1,2,5,3,4,null,6]）为例 具体说明为何需关注该问题：
    
    // 1 经后序遍历处理后 左子树 2 会先展开为完整的链表结构 2→3→4 所有节点左指针均为 nullptr 右指针依次指向后续节点 
    // 形成连续的链表关系
    
    // 2 根节点 1 的原右子树 5 也会同步展开为链表 5→6 等待与左子树链表完成衔接 
    // 以形成完整的整体链表
    
    // 3 若忽略衔接位置的要求 误将原右子树衔接在左子树的根节点（如节点 2）的右指针上 
    // 会直接覆盖左子树根节点原本指向其后续节点（如节点 3）的右指针
    
    // 4 这种不当衔接会破坏左子树展开后已形成的连续链表关系 导致左子树中除根节点外的其他节点（如 3、4）
    // 因失去上级节点的指向而被丢弃
    
    // 5 最终无法形成 2→3→4→5→6 的完整衔接顺序 仅能形成 2→5→6 的不完整链表 
    // 导致整个展开结果缺失部分节点 不符合题目要求的链表完整性和顺序性


         // 保存根节点原来的右子树
        TreeNode* originalRight = root->right;
        // 将展开后的左子树接到根节点的右指针
        root->right = root->left;
        // 强制清空左指针，符合链表要求
        root->left = nullptr;

        // 找到新右子树（原左子树）的末尾节点
        TreeNode* current = root;
        while (current->right != nullptr) {
            current = current->right;
        }

        // 将原右子树接到末尾节点的右指针，完成整个链表衔接
        current->right = originalRight;
    }

    void flatten(TreeNode* root) {
        TreeNode* _root = root;
        _flatten(_root);
    }
};